Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ad37a27
Use astropy Tables for data everywhere
jvansanten Sep 9, 2024
30c8a29
Load npz file if present
jvansanten Sep 10, 2024
14c3b65
Improve cache coherence in NTSeason.simulate_background
jvansanten May 6, 2025
50b4107
CircularGaussian: do not attempt to modify data in-place
jvansanten Jun 3, 2025
a49003c
Blacken/isorten following #415
jvansanten Jul 8, 2025
1712158
Merge remote-tracking branch 'upstream/master' into improve-cache-coh…
jvansanten Jul 8, 2025
538f6b1
Use Table for EffectiveAreaInjector
jvansanten Jul 10, 2025
fb41d61
Annotate factory functions
jvansanten Jul 10, 2025
382c9a9
Avoid modifying columns in place
jvansanten Jul 11, 2025
883f07b
Use instance variables in NorthernTracksKDE
jvansanten May 6, 2025
1c07500
Normalize KDE PDF to region of interest
jvansanten Jul 8, 2025
1b910b6
Speed up TableInjector
jvansanten Jul 11, 2025
4302474
Speed up StaticFloor
jvansanten Jul 11, 2025
aed0b89
Cache effective injection time for steady sources
jvansanten May 7, 2025
4c8c14c
Remove upper bound on n_s
jvansanten Jul 2, 2025
a5fd0e3
Squeeze the last bits of fluff out of StdMatrixKDEEnabledLLH.get_spat…
jvansanten Jul 15, 2025
7b28087
Evaluate SoB for different gammas lazily
jvansanten Jul 15, 2025
fe94c77
Use less accurate (but much faster) angular distance calculation in N…
jvansanten Jul 15, 2025
afce494
Annotate PDF factory functions
jvansanten Jul 15, 2025
3a1ba3d
HACK: allow StdMatrixKDEEnabledLLH to use CircularGaussian pdf
jvansanten May 7, 2025
0e91b81
Revert "Annotate PDF factory functions"
jvansanten Jul 15, 2025
d306c41
Normalize gaussian PDF
jvansanten Jul 15, 2025
0725dc5
WIP: King function PSF
jvansanten Jul 16, 2025
22b357d
chore: annotate BaseInjector
jvansanten Jul 17, 2025
9732bb0
Allow Season to simulate background only in the source box
jvansanten Jul 18, 2025
57e0e75
Evaluate energy SoB lazily
jvansanten Jul 25, 2025
28e4eb8
Add log of King PDF
jvansanten Jul 25, 2025
6e2190f
Add an option to disable energy S/B interpolation
jvansanten Jul 28, 2025
dd2d1e7
Use splines for King PDF parameters
jvansanten Jul 29, 2025
b74d793
Speed up make_season_weight 10x
jvansanten Jul 29, 2025
6732da8
Microoptimization: sparse matrix projection 25% faster
jvansanten Jul 29, 2025
ff662b6
Microoptimization: slice result of background pdf calculation instead…
jvansanten Jul 30, 2025
6f6ef39
Merge remote-tracking branch 'upstream/master' into king-psf-wip
jvansanten Sep 4, 2025
c0fea45
mypy cleanup
jvansanten Sep 4, 2025
757a92e
Merge branch 'master' into king-psf-wip
jvansanten Sep 5, 2025
a0042fc
Guard annotation-only imports
jvansanten Sep 5, 2025
7793e01
Cosmetic: raw string for latex
jvansanten Sep 5, 2025
65a1d5c
Return excluded events from create_dataset in unblinded injectors
jvansanten Sep 5, 2025
6062e97
Consider excluded events in flare likelihoods (but require ==0)
jvansanten Sep 5, 2025
8b76273
Handle unbounded n_s in 1D llh scan
jvansanten Sep 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import matplotlib.pyplot as plt
import numpy as np
from numpy.lib.recfunctions import append_fields

from flarestack.core.astro import angular_distance
from flarestack.data.icecube.ps_tracks.ps_v002_p01 import IC86_1_dict
Expand Down Expand Up @@ -93,9 +92,7 @@ def weighted_quantile(values, quantiles, weight):
cut_mc = mc[mask]

percentile = np.ones_like(cut_mc["ra"]) * np.nan
cut_mc = append_fields(
cut_mc, "percentile", percentile, usemask=False, dtypes=[np.float]
)
cut_mc.add_column(percentile, name="percentile")

weights = cut_mc["ow"] * cut_mc["trueE"] ** -gamma
# weights = np.ones_like(cut_mc["ow"])
Expand Down

Large diffs are not rendered by default.

47 changes: 37 additions & 10 deletions flarestack/core/angular_error_modifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import logging
import os
import pickle as Pickle
from collections.abc import Callable, Mapping
from typing import Any, Collection, Iterator, KeysView, TypeVar

import numexpr
import numpy as np
Expand Down Expand Up @@ -36,7 +38,7 @@


class BaseFloorClass(object):
subclasses: dict[str, object] = {}
subclasses: dict[str, type["BaseFloorClass"]] = {}

def __init__(self, floor_dict):
self.floor_dict = floor_dict
Expand All @@ -56,7 +58,7 @@ def decorator(subclass):
return decorator

@classmethod
def create(cls, floor_dict):
def create(cls, floor_dict) -> "BaseFloorClass":
floor_name = floor_dict["floor_name"]

if floor_name not in cls.subclasses:
Expand Down Expand Up @@ -129,7 +131,7 @@ def __init__(self, floor_dict):
)

def floor(self, data):
return np.array([self.min_error for _ in data])
return self.min_error


class BaseQuantileFloor(BaseFloorClass):
Expand Down Expand Up @@ -197,6 +199,30 @@ def create_function(self, pickled_array):
return lambda data, params: func(data["logE"])
"""

_K = TypeVar("_K")
_V = TypeVar("_V")


class LazyDict(Mapping[_K, _V]):
def __init__(self, keys: Collection[_K], func: Callable[[_K], _V]):
self._keys = frozenset(keys)
self._func = func
self._store: dict[_K, _V] = dict()

def keys(self) -> KeysView[_K]:
return self._keys # type: ignore[return-value]

def __iter__(self) -> Iterator[_K]:
return iter(self._keys)

def __len__(self):
return len(self._keys)

def __getitem__(self, key: _K) -> _V:
if key not in self._store:
self._store[key] = self._func(key)
return self._store[key]


@BaseFloorClass.register_subclass("quantile_floor_1d_e")
class QuantileFloor1D(BaseQuantileFloor, BaseDynamicFloorClass):
Expand All @@ -218,9 +244,9 @@ def create_function(self, pickled_array):


class BaseAngularErrorModifier(object):
subclasses: dict[str, object] = {}
subclasses: dict[str, type["BaseAngularErrorModifier"]] = {}

def __init__(self, pull_dict):
def __init__(self, pull_dict: dict[str, Any]) -> None:
self.season = pull_dict["season"]
self.floor = BaseFloorClass.create(pull_dict)
self.pull_dict = pull_dict
Expand Down Expand Up @@ -252,7 +278,7 @@ def create(
floor_name="static_floor",
aem_name="no_modifier",
**kwargs,
):
) -> "BaseAngularErrorModifier":
pull_dict = dict()
pull_dict["season"] = season
pull_dict["e_pdf_dict"] = e_pdf_dict
Expand All @@ -278,15 +304,16 @@ def pull_correct_dynamic(self, data, params):

def create_spatial_cache(self, cut_data, SoB_pdf):
if len(inspect.getfullargspec(SoB_pdf)[0]) == 2:
SoB = dict()
for gamma in get_gamma_support_points(precision=self.precision):
SoB[gamma] = np.log(SoB_pdf(cut_data, gamma))
SoB = LazyDict(
get_gamma_support_points(precision=self.precision),
lambda gamma: np.log(SoB_pdf(cut_data, gamma)),
)
else:
SoB = SoB_pdf(cut_data)
return SoB

def estimate_spatial(self, gamma, spatial_cache):
if isinstance(spatial_cache, dict):
if isinstance(spatial_cache, Mapping):
return self.estimate_spatial_dynamic(gamma, spatial_cache)
else:
return spatial_cache
Expand Down
25 changes: 25 additions & 0 deletions flarestack/core/astro.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Function taken from IceCube astro package.
"""

import numexpr
import numpy as np


Expand Down Expand Up @@ -33,3 +34,27 @@ def angular_distance(lon1, lat1, lon2, lat2):
cd = np.cos(lon2 - lon1)

return np.arctan2(np.hypot(c2 * sd, c1 * s2 - s1 * c2 * cd), s1 * s2 + c1 * c2 * cd)


# Fast angular distance using numexpr to avoid creating large temporary arrays
fast_angular_distance = numexpr.NumExpr(
"arccos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(fmod(lon2 - lon1 + pi, 2 * pi) - pi))",
signature=[
("lon1", np.float64),
("lat1", np.float64),
("lon2", np.float64),
("lat2", np.float64),
("pi", np.float64),
],
)

# NB: numexpr implements fmod but not mod, and mod is equivalent to abs(fmod(...))
in_ra_window = numexpr.NumExpr(
"abs(abs(fmod(lon1 - lon2 + pi, 2 * pi)) - pi) < dPhi",
signature=[
("lon1", np.float64),
("lon2", np.float64),
("pi", np.float64),
("dPhi", np.float64),
],
)
4 changes: 2 additions & 2 deletions flarestack/core/energy_pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class EnergyPDF(object):
A base class for Energy PDFs.
"""

subclasses: dict[str, object] = {}
subclasses: "dict[str, type[EnergyPDF]]" = {}

def __init__(self, e_pdf_dict):
"""
Expand Down Expand Up @@ -103,7 +103,7 @@ def decorator(subclass):
return decorator

@classmethod
def create(cls, e_pdf_dict):
def create(cls, e_pdf_dict) -> "EnergyPDF":
e_pdf_dict = read_e_pdf_dict(e_pdf_dict)

e_pdf_name = e_pdf_dict["energy_pdf_name"]
Expand Down
Loading
Loading