Skip to content

Instantly share code, notes, and snippets.

@briehanlombaard
Last active August 29, 2015 14:04
Show Gist options
  • Select an option

  • Save briehanlombaard/6ecabbdb4a597b52d0fa to your computer and use it in GitHub Desktop.

Select an option

Save briehanlombaard/6ecabbdb4a597b52d0fa to your computer and use it in GitHub Desktop.
Streams .fits files to the browser using websockets.
# wget these files first by running:
# $ wget -i fitsfiles
http://spacewarps.org/subjects/raw/CFHTLS_074_2382_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_074_2382_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_074_2382_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_074_2382_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_074_2382_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_077_1278_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_077_1278_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_077_1278_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_077_1278_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_077_1278_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_079_2434_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_079_2434_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_079_2434_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_079_2434_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_079_2434_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_0979_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_0979_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_0979_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_0979_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_0979_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_2405_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_2405_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_2405_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_2405_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_080_2405_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0052_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0052_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0052_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0052_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0052_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0053_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0053_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0053_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0053_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0053_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0054_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0054_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0054_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0054_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0054_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0055_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0055_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0055_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0055_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0055_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0056_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0056_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0056_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0056_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0056_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0057_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0057_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0057_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0057_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0057_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0058_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0058_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0058_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0058_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0058_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0059_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0059_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0059_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0059_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0059_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0060_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0060_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0060_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0060_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0060_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0061_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0061_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0061_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0061_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0061_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0062_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0062_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0062_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0062_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0062_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0063_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0063_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0063_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0063_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0063_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0064_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0064_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0064_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0064_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0064_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0065_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0065_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0065_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0065_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0065_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0066_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0066_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0066_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0066_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0066_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0067_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0067_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0067_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0067_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0067_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0068_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0068_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0068_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0068_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0068_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0069_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0069_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0069_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0069_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0069_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0070_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0070_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0070_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0070_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0070_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0071_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0071_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0071_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0071_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0071_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0072_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0072_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0072_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0072_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0072_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0073_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0073_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0073_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0073_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0073_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0074_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0074_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0074_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0074_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0074_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0075_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0075_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0075_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0075_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0075_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0076_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0076_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0076_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0076_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0076_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0077_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0077_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0077_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0077_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0077_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0078_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0078_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0078_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0078_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0078_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0079_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0079_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0079_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0079_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0079_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0080_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0080_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0080_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0080_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0080_z.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0081_g.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0081_i.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0081_r.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0081_u.fits.fz
http://spacewarps.org/subjects/raw/CFHTLS_082_0081_z.fits.fz
<!doctype html>
<html>
<head>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100%; }
</style>
</head>
<body>
</body>
<script src="/static/fits.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="/static/node_modules/three/three.min.js"></script>
<script>
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 500;
material = new THREE.MeshBasicMaterial({shading: THREE.NoShading});
geometry = new THREE.PlaneGeometry(440, 440);
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
renderer.render(scene, camera);
// Define callback for when pixels have been read from file
function render(arr, opts) {
// Get dataunit, width, and height from options
var dataunit = opts.dataunit;
var width = dataunit.width;
var height = dataunit.height;
map = new THREE.DataTexture(arr, width, height, THREE.LuminanceFormat, THREE.FloatType);
map.magFilter = THREE.NearestFilter;
map.minFilter = THREE.LinearFilter;
mesh.material.map = map;
mesh.material.map.needsUpdate = true
mesh.material.needsUpdate = true
geometry.buffersNeedUpdate = true;
geometry.uvsNeedUpdate = true;
requestAnimationFrame(function() {
renderer.render(scene, camera);
socket.emit('get');
});
}
socket = io();
socket.on('file', function(buffer) {
var f = new astro.FITS(new Blob([buffer.buffer]), function(f) {
// Get first data unit
var dataunit = f.getDataUnit();
// Get pixels representing the image and pass callback with options
dataunit.getFrame(0, render, {dataunit: dataunit});
});
});
</script>
</html>
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
var glob = require('glob');
const FILES = glob.sync('**/*.fits.fz');
app.get('/', function(req, res) {
res.sendfile('index.html');
});
app.use('/static', express.static(__dirname));
io.on('connection', function(socket) {
socket.on('get', function() {
var file = FILES.pop();
if (file) {
console.log('sending ' + file);
fs.readFile(file, function(error, buffer) {
socket.emit('file', {buffer: buffer});
delete buffer;
});
} else {
console.log('no more files to send');
}
});
});
http.listen(3000, function() {
console.log('listening on *:3000');
});
{
"name": "sandbox",
"version": "0.0.0",
"description": "",
"license": "MIT",
"dependencies": {
"express": "~4.4.3",
"socket.io": "~1.0.4",
"glob": "~4.0.2",
"three": "~0.67.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment