llama.files.i3.json module¶
Methods and FileHandler
classes associated with fetching IceCube neutrino
triggers.
-
class
llama.files.i3.json.
IceCubeNeutrinoList
¶ Bases:
llama.filehandler.JSONFile
,llama.files.healpix.skymap.HEALPixPSF
Takes a list of dictionaries describing neutrinos and saves it to a text file. Validates the neutrino data to make sure each neutrino contains (minimally) the following properties:
mjd
zenith
azimuth
sigma
energy
type (one the values found in
NEUTRINO_TYPES
)
If this file is generated within the temporal search window for neutrinos, it is possible not all neutrinos needed for the final result will be available. In this case, the file will automatically become
obsolete
and will be regenerated after the window has elapsed.Neutrinos from IceCube can be delayed due to communications issues; to combat this, when neutrinos are pulled from the online data stream after the temporal search window has elapsed, a check will be run to see if the next neutrino after the end of the search window is yet available. If it is not available, it is assumed that not all neutrinos needed for the search have arrived from south pole, and a
GenerationError
will be raised, allowing the pipeline to cooldown and retry the neutrino pull later.Neutrinos pulled from before
MJD_TOPIC_SWITCH_17_TO_BLANK
will be automatically pulled from local GFU archives (stored online on LLAMA S3 and cached locally after use inllama.utils.CACHEDIR
in*.npy
format). Neutrinos from after this date will be pulled from the online GFU stream.-
DEPENDENCIES
= (<class 'llama.files.skymap_info.SkymapInfo'>,)¶
-
DETECTORS
= (Detector(name='IceCube', abbrev='i3', fullname='IceCube', url='http://wiki.icecube.wisc.edu', summary='IceCube', description='', citations=ImmutableDict({})),)¶
-
FILENAME
= 'icecube_neutrino_list.json'¶
-
MANIFEST_TYPES
= (<class 'llama.files.i3.json.IceCubeNeutrinoList'>,)¶
-
UR_DEPENDENCIES
= (<class 'llama.files.skymap_info.SkymapInfo'>,)¶
-
UR_DEPENDENCY_TREE
= frozenset({<class 'llama.files.skymap_info.SkymapInfo'>})¶
-
downselect
(ra=None, dec=None, ntype=None)¶ Downselect the neutrino list to match given criteria. Save the old neutrino list with the original filename prefixed by a timestamp and replace it with the downselected list.
- Parameters
ra (list) – Right-ascension intervals (in degrees) that the neutrinos must fall into, e.g.
[(21, 41),(92, 102)]
dec (list) – Decliination intervals (in degrees) that the neutrinos must fall into, e.g.
[(-3, 20)]
ntype (str) – A type that the neutrino must match, e.g.
'observation'
for real neutrinos.
-
end_of_neutrino_window
()¶ The GPS time at which all neutrinos should be in under normal circumstances.
-
is_complete
()¶ Whether the list of neutrinos is complete. Assumes incomplete if no
complete
key specified.
-
is_obsolete
(checked=None, **kwargs)¶ IceCubeNeutrinoList
files can be fetched immediately after a GW event becomes available. However, we want to eventually run our analysis on all neutrinos in a certain time window around an event. We therefore want to re-fetch the neutrinos in that time window after the time window has passed (allowing a safety factor for the IceCube GFU API to process new neutrino triggers). To do this, we mark theIceCubeNeutrinoList
as obsolete if the current time is after the time window + safety margin has elapsed and the neutrino list was generated before that time had passed (meaning there might have been new neutrinos saved that are useful for the analysis after the file was originally generated). StandardFileHandler
obsolescence criteria are also used to determine obsolescence through a call tosuper
.
-
property
neutrinos
¶ Return a list containing a
Neutrino
object for each neutrino; more convenient to work with when writing formulae than dealing directly with the neutrino dictionaries.
-
property
num_triggers
¶ The number of triggers described by this file. Useful mostly for quickly determining if this trigger list is empty.
-
source_locations
()¶ Returns a list of tuples of
(RA, Dec, sigma)
for all point-like sources, where(RA, Dec)
is the central sky position andsigma
is the standard deviation of the Gaussian PSF. Since this depends on the structure of data in the relevant file handler, it must be specified for each subclass.
-
property
template_skymap_filehandler
¶ The
HEALPixSkyMapFileHandler
whose HEALPix parameters should be used as a template for theHEALPixSkyMap
output by thisFileHandler
. It is assumed that thisHEALPixSkyMapFileHandler
only returns one skymap in its list; consequently, only the first skymap loaded by this file handler will be used. Note that the template skymap file handler is likely not a dependency of this file handler; it is only used as a default for formatting generated skymaps from this file handler’s data.
-
class
llama.files.i3.json.
RctGdbIceCubeNeutrinoList
¶ Bases:
llama.files.gracedb.GraceDBReceipt
-
DEPENDENCIES
= (<class 'llama.files.i3.json.IceCubeNeutrinoList'>,)¶
-
FILENAME
= 'rct_gdb_icecube_neutrino_list.json.log'¶
-
MANIFEST_TYPES
= (<class 'llama.files.i3.json.RctGdbIceCubeNeutrinoList'>,)¶
-
UPLOAD
¶ alias of
IceCubeNeutrinoList
-
UR_DEPENDENCIES
= (<class 'llama.files.skymap_info.SkymapInfo'>, <class 'llama.files.i3.json.IceCubeNeutrinoList'>)¶
-
UR_DEPENDENCY_TREE
= frozenset({<class 'llama.files.i3.json.IceCubeNeutrinoList'>})¶
-
property
log_message
¶ GraceDB upload log message for <class ‘llama.files.i3.json.IceCubeNeutrinoList’>
-
-
class
llama.files.i3.json.
RctSlkLmaIceCubeNeutrinoList
¶ Bases:
llama.files.slack.SlackReceiptLlama
-
DEPENDENCIES
= (<class 'llama.files.i3.json.IceCubeNeutrinoList'>, <class 'llama.files.skymap_info.SkymapInfo'>)¶
-
FILENAME
= 'rct_slk_lma_icecube_neutrino_list.json.json'¶
-
FILENAME_FMT
= 'rct_slk_lma_{}.json'¶
-
MANIFEST_TYPES
= (<class 'llama.files.i3.json.RctSlkLmaIceCubeNeutrinoList'>,)¶
-
UPLOAD
¶ alias of
IceCubeNeutrinoList
-
UR_DEPENDENCIES
= (<class 'llama.files.skymap_info.SkymapInfo'>, <class 'llama.files.i3.json.IceCubeNeutrinoList'>)¶
-
UR_DEPENDENCY_TREE
= frozenset({<class 'llama.files.i3.json.IceCubeNeutrinoList'>})¶
-
class_vetoes
= ()¶
-
-
llama.files.i3.json.
blinder
(neutrino, unblinded_times=())¶ Randomize neutrino azimuth (and hence right ascension) for neutrinos triggered at times that are not explicitly approved for unblinded analysis.
- Parameters
neutrino (dict) – A neutrino dictionary in the format returned by format_neutrinos.
unblinded_times (array_like, optional) – An iterable of [start, end] times (specified in UTC MJD format) in which we are approved by IceCube to pull unblinded neutrinos for our analysis. If not provided, it is assumed that ALL neutrinos should be blinded (DEFAULT:
tuple()
).
- Returns
blinded – The same neutrino provided as a parameter with the azimuth (and hence right ascension) with RA scrambled if necessary. If the neutrino’s MJD falls inside one of these intervals, it will be returned unchanged. If it falls outside all of these intervals, its azimuth will be set to a random value. This is a fresh copy of the neutrino; the neutrino provided as input is not modified in place.
- Return type
dict
Examples
>>> neutrino_time = 57990 >>> unblinded_times = [[neutrino_time-1, neutrino_time+1]] >>> neutrino = { ... "mjd": neutrino_time, ... "zenith": 90, ... "sigma": 0.3, ... "energy": 5000, ... "azimuth": 270, ... "bdt_up": 1, ... } >>> blind = blinder(neutrino, unblinded_times=[]) >>> blind['azimuth'] == neutrino['azimuth'] False >>> unblind = blinder(neutrino, unblinded_times=unblinded_times) >>> unblind['azimuth'] == neutrino['azimuth'] True
-
llama.files.i3.json.
format_neutrinos
(neutrinos)¶ Read in ICECUBE neutrinos as returned by realtime_tools.live.get_events and put them in the format that LLAMA expects.
-
llama.files.i3.json.
get_archive
(mjd_start, mjd_end)¶ Fetch neutrinos from a local archive. Archive must be defined and stored on LLAMA S3 for the queried neutrinos, and you must have access to LLAMA S3 API credentials to retrieve the archive.
- Parameters
mjd_start (float) – The start of the time window in which to search for neutrinos in Modified Julian Date (MJD) format. Use
gps2mjd
orutc2mjd
from thellama.utils
module to make the time conversions to the appropriate format.mjd_end (float) – The end of the time window in which to search for neutrinos.
- Returns
formatted – A list of neutrino dictionaries formatted as expected by IceCubeNeutrinoList. If mjd_start > mjd_end, no error will be raised; instead, an empty list of neutrinos will be returned.
- Return type
list
- Raises
FileNotFoundError – If data for the requested time range is not available.
Examples
You can confirm that the archival neutrino data is available by fetching a specific trigger from the archive: >>> neutrino = get_archive(58392, 58393)[0] >>> neutrino[‘run’] 131569 >>> neutrino[‘event’] 43188689
-
llama.files.i3.json.
get_archive_and_real_neutrinos
(mjd_start, mjd_end, blinded_neutrinos=None, check_complete=False)¶ Get a mix of archival and real online GFU neutrinos (automatically calls
get_archive
andget_real
as appropriate). Pulls online neutrinos for dates afterMJD_TOPIC_SWITCH_17_TO_BLANK
and archival neutrinos for dates prior.- Parameters
mjd_start (float) – The start of the time window in which to search for neutrinos in Modified Julian Date (MJD) format. Use
gps2mjd
orutc2mjd
from thellama.utils
module to make the time conversions to the appropriate format.mjd_end (float) – The end of the time window in which to search for neutrinos.
blinded_neutrinos (bool, optional) – Whether the neutrinos should be forcefully blinded or not. Use this to blind the neutrinos even if they are from time windows approved for unblinding (e.g. when doing background sensitivity studies). If not specified, use
UNBLINDED_TIMES
to determine which neutrinos can be unblinded.check_complete (bool, optional) – Neutrinos from IceCube can be delayed due to communications issues; to combat this, when neutrinos are pulled from the online data stream and
check_complete
isTrue
, a check will be run to see if the next neutrino after the end of the search window is yet available. If it is not available, it is assumed that not all neutrinos needed for the search have arrived from south pole, and aGenerationError
will be raised, allowing the pipeline to cooldown and retry the neutrino pull later.
- Returns
formatted – A list of neutrino dictionaries formatted as expected by IceCubeNeutrinoList. If mjd_start > mjd_end, no error will be raised; instead, an empty list of neutrinos will be returned. Each neutrino will be blinded if
blinded_neutrinos
isTrue
or if its event time falls outside the list of approvedUNBLINDED_TIMES
.- Return type
list
Examples
Pull some blinded archival neutrinos >>> a_start = MJD_TOPIC_SWITCH_17_TO_BLANK-1.77 >>> a_end = MJD_TOPIC_SWITCH_17_TO_BLANK >>> arc = get_archive_and_real_neutrinos(a_start, a_end, True) >>> len(arc) > 0 True
Pull some blinded GFU neutrinos >>> l_start = MJD_TOPIC_SWITCH_17_TO_BLANK >>> l_end = MJD_TOPIC_SWITCH_17_TO_BLANK + 500/86400. >>> live = get_archive_and_real_neutrinos(l_start, l_end, True) >>> len(live) > 0 True
Pull a mix of archival and blinded neutrinos >>> mix = get_archive_and_real_neutrinos(a_start, l_end, True) >>> len(arc) + len(live) == len(mix) True
-
llama.files.i3.json.
get_dec_filter
(dec)¶ Return a function that will filter neutrinos based on DECLINATION, e.g. for use with the
filter
function.- Parameters
dec (list) – A list of declination intervals (also specified as lists) into which a selected neutrino should fall, e.g. [[ 21, 41 ],[ 92, 102 ]].
- Returns
dec_filter – A function which returns
True
when passed a neutrino that falls within at least one of the declination intervals passed included indec
. The neutrino is expected to be in the format returned byformat_neutrinos
.- Return type
function
Examples
>>> neutrino = { ... 'azimuth': 246.16444118441663, ... 'bdt_up': -0.0155, ... 'energy': 498.10789, ... 'mjd': 57982.5321185039, ... 'sigma': 1.5478695443038595, ... 'zenith': 113.7504569829126 ... } >>> ra, dec = zen_az2ra_dec( ... neutrino['mjd'], ... neutrino['zenith'], ... neutrino['azimuth'] ... ) >>> f"RA: {ra:.3f}, Dec: {dec:.3f}" 'RA: 1.253, Dec: 23.653' >>> get_dec_filter([[0,30],[50,60]])(neutrino) True >>> get_dec_filter([[0,20],[50,60]])(neutrino) False
-
llama.files.i3.json.
get_ra_filter
(ra)¶ Return a function that will filter neutrinos based on RIGHT ASCENSION, e.g. for use with the
filter
function.- Parameters
ra (list) – A list of right ascension intervals (also specified as lists) into which a selected neutrino should fall, e.g. [[ 21, 41 ],[ 92, 102 ]].
- Returns
ra_filter – A function which returns
True
when passed a neutrino that falls within at least one of the right ascension intervals passed included inra
. The neutrino is expected to be in the format returned byformat_neutrinos
.- Return type
function
Examples
>>> neutrino = { ... 'azimuth': 246.16444118441663, ... 'bdt_up': -0.0155, ... 'energy': 498.10789, ... 'mjd': 57982.5321185039, ... 'sigma': 1.5478695443038595, ... 'zenith': 113.7504569829126 ... } >>> ra, dec = zen_az2ra_dec( ... neutrino['mjd'], ... neutrino['zenith'], ... neutrino['azimuth'] ... ) >>> f"RA: {ra:.3f}, Dec: {dec:.3f}" 'RA: 1.253, Dec: 23.653' >>> get_ra_filter([[0, 30], [50, 60]])(neutrino) True >>> get_ra_filter([[5, 30], [50, 60]])(neutrino) False
-
llama.files.i3.json.
get_real
(mjd_start, mjd_end, check_complete=False)¶ Fetch real neutrinos from ICECUBE’s database; takes gps time of the events and the time range abnut this central value over which to search for neutrinos.
- Parameters
mjd_start (float) – The start of the time window in which to search for neutrinos in Modified Julian Date (MJD) format. Use
gps2mjd
orutc2mjd
from thellama.utils
module to make the time conversions to the appropriate format.mjd_end (float) – The end of the time window in which to search for neutrinos.
check_complete (bool, optional) – Neutrinos from IceCube can be delayed due to communications issues; to combat this, when
check_complete
isTrue
, a check will be run to see if the next neutrino after the end of the search window is yet available. If it is not available, it is assumed that not all neutrinos needed for the search have arrived from south pole, and aGenerationError
will be raised, allowing the pipeline to cooldown and retry the neutrino pull later.
- Returns
formatted – A list of neutrino dictionaries formatted as expected by IceCubeNeutrinoList. If mjd_start > mjd_end, no error will be raised; instead, an empty list of neutrinos will be returned.
- Return type
list
- Raises
ValueError – If the start time of the neutrino pull predates the switch from the ‘neutrino17’ topic to the ‘neutrino’ topic (in late 2018), a
ValueError
is raised. The date of this switch is given byMJD_TOPIC_SWITCH_17_TO_BLANK
.
Examples
Get some neutrinos from late-2018 on the ‘neutrino’ topic: >>> from llama.utils import utc2mjd >>> mjd = utc2mjd(“2018-09-30”) >>> len(get_real(mjd-500/86400., mjd+500/86400.)) > 0 True
If your end time is earlier than your start time, you’ll get an empty neutrino list: >>> get_real(mjd, mjd-1) []
You should be able to fetch this neutrino from the online GFU database: >>> neutrino = get_archive(58392, 58393)[0] >>> neutrino[‘run’] 131569 >>> neutrino[‘event’] 43188689
-
llama.files.i3.json.
neutrino_archive_available_years
()¶ Get a list of years for which archival GFU neutrinos are available. These files are stored remotely on LLAMA S3 (see
llama.com.s3
) as.npy
files and are cached locally inllama.utils.OBJECT_DIR
; these are private files that require LLAMA S3 credentials to access. Archival neutrino releases available via LLAMA S3 are recorded inARCHIVAL_NEUTRINOS
, and the default archival release version is contained inDEFAULT_ARCHIVE
.Examples
Confirm that we have access to archival neutrinos from 2011 through 2018:
>>> neutrino_archive_available_years() [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
-
llama.files.i3.json.
random
() → x in the interval [0, 1).¶