Examples
This page gives small, copyable examples. They are intentionally compact; for
interactive exploration, see the notebooks in the repository’s example/
directory.
Minimal synthetic light curve
The high-level finder expects a full light curve, not pre-computed residuals. This example creates a simple microlensing-like event with a localized deviation and runs the default PSPL workflow.
import numpy as np
from jacscanomaly import CandidateCriteria, Finder, FinderConfig
rng = np.random.default_rng(3)
time = np.linspace(0.0, 100.0, 500)
baseline = np.ones_like(time)
event = 0.7 / np.sqrt(1.0 + ((time - 50.0) / 8.0) ** 2)
anomaly = 0.08 * np.exp(-0.5 * ((time - 56.0) / 0.8) ** 2)
ferr = np.full_like(time, 0.01)
flux = baseline + event + anomaly + rng.normal(0.0, ferr)
config = FinderConfig(
fitter_kind="pspl",
gap=50.0,
candidate_criteria=CandidateCriteria(min_n_eff=2.0),
)
finder = Finder(config)
result = finder.run(time, flux, ferr)
result.print_summary()
The default PSPL workflow uses the C++ backends. You can still make that explicit when writing survey scripts:
config = FinderConfig(
fitter_kind="pspl",
grid_backend="cpp",
single_fit_backend="cpp",
candidate_criteria=CandidateCriteria(min_n_eff=2.0),
)
Running only the baseline fit
Use jacscanomaly.Finder.fit_single_lens() if you only want the fitted
single-lens model:
fit = finder.fit_single_lens(time, flux, ferr)
params = dict(zip(fit.param_names, np.asarray(fit.params)))
print(params)
print(float(fit.chi2_dof))
If the automatic initialization is not appropriate for a difficult event, pass an explicit initial guess:
x0 = np.array([50.0, 8.0, 0.2])
fit = finder.fit_single_lens(time, flux, ferr, x0=x0)
Using candidate criteria
One-point artifacts can have large dchi2. CandidateCriteria lets you
discard such candidates before the best candidate is selected:
criteria = CandidateCriteria(
min_dchi2=20.0,
min_n_eff=2.0,
min_n_contrib=2,
max_peak_frac=0.8,
)
config = FinderConfig(candidate_criteria=criteria)
For anomaly searches, min_n_eff is usually the first criterion to consider.
It removes candidates whose apparent improvement is dominated by one or two
points.
Plotting
After jacscanomaly.Finder.run(), plotting methods use the most recent
result:
import matplotlib.pyplot as plt
finder.plot_result()
finder.plot_anomaly_window()
plt.show()
The summary plot is best for seeing the whole light curve and scan statistic. The window plot is best for checking whether the candidate is supported by multiple data points.
Example notebooks
The repository includes:
example/template_scan_example.ipynbStandard bell-template residual scan.
example/template_free_example.ipynbTemplate-free residual chi-square scan.