Skip to content

Instantly share code, notes, and snippets.

View matham's full-sized avatar

Matt Einhorn matham

View GitHub Profile
import tqdm
import subprocess
from pathlib import Path
import csv
CSV_NAME = "_tracked_annotated"
def get_csv_mp4(root: Path) -> list[Path]:
csvs = set()
@matham
matham / play_network.py
Created April 17, 2025 21:27
Client API for receiving images from a Filers server over the network (or locally).
"""
Client API for receiving images from a Filers server over the network (or locally).
To install::
pip install tree_config ffpyplayer
To use, see `RemoteVideoPlayer` and the sample script at the end.
"""
from itertools import accumulate
@matham
matham / imspector_scripting.py
Created February 3, 2025 20:55
Tools for acquiring and processing LaVision lightsheet data
import pyautogui as pag
import pyscreeze
import pygetwindow
import pyperclip
from PIL import Image
import time
import datetime
from pathlib import Path
from dataclasses import dataclass
from textwrap import dedent
@matham
matham / lightsheet_lens.py
Created February 3, 2025 20:48
Analyzes lightsheet optics for lenses and RI
import math
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import scipy.special
from scipy.stats import linregress
from scipy import integrate
import scipy.optimize as optimize
from scipy.optimize import curve_fit, minimize, Bounds
import numpy as np
from functools import partial
@matham
matham / behavior_analysis.py
Last active October 26, 2025 08:32
Export results for teaball experiments - sniffing, occupancy etc
from dataclasses import dataclass, field
import pprint
from collections.abc import Sequence
from typing import Callable, Union, Literal, Any, Optional
from pathlib import Path
import csv
from scipy.signal import decimate
from tempfile import TemporaryDirectory
import subprocess
from pathlib import Path
import csv
import numpy as np
root = Path(r"...")
odors = {"CH4", "NH3", "TBP", "TEP", "Air", "Humidity"}
odors = list(sorted(odors))
confusents = {"None", "Diesel", "Gasoline", "Roundup", "Tobacco", "Smoke", "Vanilla"}
confusents = list(sorted(confusents))
import h5py
import matplotlib.pyplot as plt
import numpy as np
import re
from elephant.statistics import time_histogram
import quantities
from neo import SpikeTrain
def arr2str(arr):
package com.cplab.jstripe;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import io.scif.ImageMetadata;
import io.scif.config.SCIFIOConfig;
comm = TeensyComm()
comm.create_serial_device('COM5')
comm.write_serial(comm.make_modio_create(15, 2, 0x12, ModIOFreq.freq_100k, ModIOPullup.disabled))
comm.write_serial(comm.make_modio_write_digital(46, 2, 0x12, False, True))
comm.write_serial(comm.make_modio_write_digital(46, 2, 0x12, False))
for i in range(200):
comm.write_serial(comm.make_modio_write_digital(46, 2, 0x12, *vals[i % 2]))
#comm.write_serial(comm.make_modio_write_digital(46, 2, 0x13, *vals[i % 2]))
import trio
import contextlib
from async_generator import aclosing
async def gen():
for i in range(10):
yield i