The IceCube Public Data Project

The purpose of IceCube's open data format is to provide the general scientific community access to IceCube's data, without requiring the use of internal proprietary software. More information about the IceCube project can be found here. This project addresses the Data Release Set 2 in the IceCube Open Data Policy. For IceCube/AMANDA neutrino public data samples see this page.

Below are short list of relevant papers illustrating the function of the IceCube detector.

Project Overview

This project aims to provide the community with calibrated IceCube data, without reconstructions, consisting of the run number, trigger information (i.e. time and type), and an array of photo-electron signals. Photo-electrons represent the electrical signal created when photons strike the surface of IceCube's Digital Optical Modules (DOM), so their amplitude (i.e. "charge"), position (the position of the DOM that was struck), and the photon's arrival time are recorded in the data.

The data will be grouped together by year starting with the 2011 86 string (i.e. complete) detector. The size of each dataset will be on the order of 10 TB (TeraByte) per year and instructions on how to obtain datasets will be provided through this project. Along with the full datasets, smaller neutrino samples and test datasets will also be provided.

Below is a brief list of what this project will provide:

IceCube86/IceTop80 Triggers by Year

The IceCube Coordinate System

The position of the hits (x,y,z) are in units of meters where the +y-axis is in the direction of grid north (i.e. parallel to the prime meridian), the +x-axis is in the direction of grid east, and the origin is in the center of the IceCube detector, approximately 1500m below the surface of the ice.

The Event Bytestream

The Event is a python class which contains all the information in an event. The binary file is then simply a stream of serialized Event objects. The documentation for the source code can be found here. Below is the defintion of the event bytestream:
  1. 4 bytes - runID(unsigned int)
  2. 4 bytes - year(unsigned int)
  3. 8 bytes - startTime (long) Number of tenths of nanoseconds since the beginning of the year.
  4. 8 bytes - eventLength(float) - Units of microseconds.
  5. 4 bytes - (long) - Number of triggers. This is not a member of the Event class, since it's simply the size of the trigger list. For each trigger the byte structure is given as :
    1. 8 bytes - trigger time (float) - Time of the trigger with respect to the start of the event.
    2. 4 bytes - nchar (int) - Number of characters in the trigger name.
    3. nchar * 1 byte - The characters that make up the trigger name.
  6. 8 bytes - nhits (long) - Number of hits in the event. The next set consists of nhits*5*8 bytes (one chunk of 8 bytes for each float of q,t,x,y,z).

Getting Started

To get up and running quickly all one needs is access to Python, which is widely distributed on nearly all systems and certainly available on even more. Access to python, however, is not a requirement. This document provides enough information about the data structure that the stream can be decoded in any language (e.g. C/C++, Fortran, IDL, etc...) and on any archictecture (e.g. 32-bit, 64-bit, big and little endian). What this project provides is the outline of the data structure and a set of tools to decode it. The data is provided as a stream of triggered and filtered events. In each event the timestamp and basic hit and trigger information is provided.


The event reader is a simple function that uses the provided write in the fileio module to translate IceCube events from the open data format. When the end of the file is reached read returns None. Below is an set of tutorials that show how to read the data.
Last Updated 12 May 2013
by Alex Olivas.