# inspect.py
"""Find csky objects inside other csky objects."""
from . import pdf, llh, trial
[docs]
def get_llh_eval(L, key=0):
"""Get a specific :class:`csky.llh.LLHEvaluator` from a
:class:`csky.llh.MultiLLHEvaluator`."""
if isinstance(key, int):
L = L.llhs[key]
else:
Ls = [l for l in L.llhs if l.llh_model.ana.key == key]
if not Ls:
raise KeyError('key {} not found'.format(key))
elif len(Ls) > 2:
raise KeyError('ambiguous key: {}'.format(key))
L = Ls[0]
if not len(L.llhs) == 1:
raise TypeError('did not resolve a unique LLHEvaluator')
return L
[docs]
def get_llh_model(L, key=0):
"""Get a :class:`csky.llh.LLHModel` from a :class:`csky.llh.MultiLLHEvaluator`
or :class:`csky.trial.TrialRunner`."""
if isinstance(L, trial.TrialRunner):
llh_models = L.llh_models
elif isinstance(L, llh.LLHEvaluatorBase):
llh_models = [l.llh_model for l in L.llhs]
if isinstance(key, int):
llh_model = llh_models[key]
else:
llh_models = [l for l in llh_models if llh_model.ana.key == key]
if not llh_models:
raise KeyError('key {} not found'.format(key))
elif len(llh_models) > 2:
raise KeyError('ambiguous key: {}'.format(key))
llh_model = llh_models[0]
return llh_model
[docs]
def get_pdf_ratio_model(L, key=0):
"""Get the overall :class:`csky.pdf.PDFRatioModel`."""
llh_model = get_llh_model(L, key=key)
return llh_model.pdf_ratio_model
[docs]
def get_space_model(L, key=0):
"""Get the spatial :class:`csky.pdf.PDFRatioModel`."""
prm = get_pdf_ratio_model(L, key)
acc_model = prm.acc_weighted_model
if isinstance(acc_model, pdf.SpaceTimePDFRatioModel):
return acc_model.space_model
else:
assert 'SpacePDF' in acc_model.__class__.__name__, 'space model not found'
return acc_model
[docs]
def get_time_model(L, key=0):
"""Get the temporal :class:`csky.pdf.PDFRatioModel`."""
prm = get_pdf_ratio_model(L, key)
acc_model = prm.acc_weighted_model
if isinstance(acc_model, pdf.SpaceTimePDFRatioModel):
return acc_model.time_model
else:
raise TypeError('time model not found')
[docs]
def get_energy_model(L, key=0):
"""Get the energy :class:`csky.pdf.PDFRatioModel`."""
prm = get_pdf_ratio_model(L, key)
models = prm.models[1:]
for model in models:
if 'EnergyPDF' in model.__class__.__name__:
return model
raise TypeError('energy model not found')
[docs]
def get_pdf_ratio_evals(L, key=0):
"""Get the overall :class:`csky.pdf.PDFRatioEvaluator`."""
L = get_llh_eval(L, key)
return L.evaluators
[docs]
def get_space_eval(L, key=0, i=0):
"""Get the spatial :class:`csky.pdf.PDFRatioEvaluator`."""
eval = get_pdf_ratio_evals(L, key)[i]
if isinstance(eval, pdf.MultiPDFRatioEvaluator):
eval = eval.evaluators[0]
if isinstance(eval, pdf.SpaceTimePDFRatioEvaluator):
eval = eval.space_evaluator
if 'SpacePDF' in eval.__class__.__name__:
return eval
else:
raise TypeError('space evaluator not found')
[docs]
def get_time_eval(L, key=0, i=0):
"""Get the temporal :class:`csky.pdf.PDFRatioEvaluator`."""
eval = get_pdf_ratio_evals(L, key)[i]
if isinstance(eval, pdf.MultiPDFRatioEvaluator):
eval = eval.evaluators[0]
if isinstance(eval, pdf.SpaceTimePDFRatioEvaluator):
eval = eval.time_evaluator
if 'TimePDF' in eval.__class__.__name__:
return eval
else:
raise TypeError('time evaluator not found')
[docs]
def get_energy_eval(L, key=0, i=0):
"""Get the energy :class:`csky.pdf.PDFRatioEvaluator`."""
eval = get_pdf_ratio_evals(L, key)[i]
if isinstance(eval, pdf.MultiPDFRatioEvaluator):
for eval in eval.evaluators:
if 'EnergyPDF' in eval.__class__.__name__:
return eval
raise TypeError('energy evaluator not found')