{ "cells": [ { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import cv2\n", "import pyautogui\n", "from PIL import Image\n", "import os\n", "from tkinter import Tk\n", "from tkinter.filedialog import askdirectory\n", "from datetime import datetime\n", "import threading\n", "import nidaqmx \n", "import time\n", "from pynput import keyboard\n", "from queue import Queue\n", "from collections import deque" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "def get_save_info():\n", " \"\"\"\n", " Prompts user for filename and directory selection.\n", " Returns:\n", " tuple: (filename, save_directory, data_filepath) where\n", " - filename: raw filename entered by user\n", " - save_directory: full path to selected directory\n", " - data_filepath: complete filepath including timestamp\n", " \"\"\"\n", " # Prompt user for filename\n", " filename = input(\"Enter filename: \")\n", " \n", " # Open window to choose directory \n", " root = Tk()\n", " root.withdraw() # Hide the main tkinter window\n", " save_directory = askdirectory(title=\"Select Directory to Save\")\n", " \n", " # Create timestamped filename\n", " data_filename = f\"{filename}_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\n", " data_filepath = os.path.join(save_directory, data_filename)\n", " \n", " return filename, save_directory, data_filepath" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def on_press(key):\n", " \"\"\"Callback function for key press\"\"\"\n", " global live\n", " try:\n", " if key.char == 'q': \n", " live = False\n", " except AttributeError:\n", " pass \n", "\n", "def key_monitor():\n", " \"\"\"Monitor keyboard input using pynput\"\"\"\n", " with keyboard.Listener(on_press=on_press) as listener:\n", " listener.join()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def analysis_worker(frame_queue, trigger_queue, window_size=20, event_threshold=0.2):\n", " \"\"\"\n", " Worker thread for dF/F calculation and event detection\n", " \n", " Args:\n", " frame_queue: Queue receiving frames from screen recording\n", " trigger_queue: Queue to send trigger requests to NIDAQ\n", " window_size: Size of rolling window for baseline\n", " event_threshold: Threshold for event detection\n", " \"\"\"\n", " # Initialize rolling buffer for F values\n", " F_buffer = deque(maxlen=window_size)\n", " \n", " while True:\n", " # Get frame from queue\n", " frame = frame_queue.get()\n", " \n", " # Check for stop signal\n", " if frame is None:\n", " print(\"Analysis worker received stop signal\")\n", " break\n", " \n", " try:\n", " # Calculate mean intensity\n", " current_F = np.mean(frame)\n", " \n", " # Add to buffer\n", " F_buffer.append(current_F)\n", " \n", " # Calculate dF/F if buffer has enough frames\n", " if len(F_buffer) >= window_size:\n", " dff = calculate_dff(current_F, F_buffer)\n", " \n", " # Event detection\n", " if dff > event_threshold:\n", " print(f\"Event detected! dF/F = {dff:.3f}\")\n", " trigger_queue.put(True) # Request NIDAQ pulse\n", " \n", " except Exception as e:\n", " print(f\"Error in analysis worker: {e}\")\n", "\n", "def nidaq_worker(trigger_queue, card_id='Dev1', port_line='port1/line0', pulse_duration=0.100):\n", " \"\"\"\n", " Worker thread for handling NIDAQ digital output\n", " \"\"\"\n", " with nidaqmx.Task() as task:\n", " task.do_channels.add_do_chan(f\"{card_id}/{port_line}\")\n", " print(f\"NIDAQ task created on {card_id}/{port_line}\")\n", " \n", " while True:\n", " # Block here until a message is received\n", " trigger = trigger_queue.get()\n", " \n", " # Exit condition: if None is received\n", " if trigger is None:\n", " print(\"NIDAQ worker received stop signal\")\n", " break\n", " \n", " try:\n", " # Create pulse: True for 1ms, then False\n", " task.write(True)\n", " time.sleep(pulse_duration) # 1ms pulse\n", " task.write(False)\n", " except Exception as e:\n", " print(f\"Error in NIDAQ worker: {e}\")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def get_fov(save_dir,filename='fov'):\n", " \"\"\"pyautogui.position() gets current pixel location of mouse on screen\n", " user marks corners of desired field of view (fov) for screen recording\"\"\"\n", " \n", " input(\"Move cursor to TOP LEFT, press ENTER\")\n", " # Move cursor to top left of fov\n", " x_tL, y_tL = pyautogui.position()\n", " \n", " input(\"Move cursor to BOTTOM RIGHT, press ENTER\")\n", " # Move cursor to bottom right of fov\n", " x_bR, y_bR = pyautogui.position()\n", "\n", " # Get params for cropping\n", " width = x_bR - x_tL\n", " height = y_bR - y_tL\n", "\n", " # Crop\n", " fov = pyautogui.screenshot(region=(x_tL, y_tL, width, height))\n", " \n", " # Save, png required to use locateOnScreen\n", " fov = fov.convert('RGB')\n", " save_path = os.path.join(save_dir, f\"{filename}.png\")\n", " fov.save(save_path)\n", "\n", " # Display the cropped image\n", " fov.show()\n", "\n", " return {'x': x_tL, 'y': y_tL, 'width': width, 'height': height}\n" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "def calculate_dff(current_F, F_buffer):\n", " \"\"\"\n", " Calculate dF/F using rolling window baseline\n", " \n", " Args:\n", " current_F: Current frame's mean intensity\n", " F_buffer: deque containing recent F values\n", " \n", " Returns:\n", " float: dF/F value\n", " \"\"\"\n", " # Calculate baseline (F0) from buffer, excluding current value\n", " F0 = np.mean(list(F_buffer)[:-1]) if len(F_buffer) > 1 else current_F\n", " \n", " # Calculate dF/F\n", " dff = (current_F - F0) / F0 if F0 != 0 else 0\n", " return dff\n", "\n", "def live_screen_record_with_analysis(fov, window_size=20, event_threshold=0.2, \n", " card_id='Dev1', port_line='port1/line0',\n", " display_live=True):\n", " \"\"\"\n", " Record screen with real-time analysis and NIDAQ output\n", " \"\"\"\n", " global live\n", " live = True\n", " frames = []\n", " \n", " # Initialize queues\n", " frame_queue = Queue() # For sending frames to analysis\n", " trigger_queue = Queue() # For sending triggers to NIDAQ\n", " \n", " # Start NIDAQ worker thread\n", " nidaq_thread = threading.Thread(\n", " target=nidaq_worker, \n", " args=(trigger_queue, card_id, port_line)\n", " )\n", " nidaq_thread.start()\n", " \n", " # Start analysis worker thread\n", " analysis_thread = threading.Thread(\n", " target=analysis_worker,\n", " args=(frame_queue, trigger_queue, window_size, event_threshold)\n", " )\n", " analysis_thread.start()\n", " \n", " # Start keyboard monitoring thread\n", " key_thread = threading.Thread(target=key_monitor)\n", " key_thread.daemon = True\n", " key_thread.start()\n", " \n", " try:\n", " while live:\n", " # Capture frame\n", " img = pyautogui.screenshot(region=(\n", " fov['x'], fov['y'], fov['width'], fov['height']\n", " ))\n", " np_img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY)\n", " \n", " # Send frame to analysis thread\n", " frame_queue.put(np_img)\n", " \n", " if display_live:\n", " cv2.imshow('Screen Recording', np_img)\n", " cv2.waitKey(1)\n", " \n", " frames.append(np_img)\n", " \n", " except Exception as e:\n", " print(f\"Error in recording: {e}\")\n", " \n", " finally:\n", " # Cleanup\n", " cv2.destroyAllWindows()\n", " \n", " # Stop worker threads\n", " frame_queue.put(None) # Stop analysis thread\n", " trigger_queue.put(None) # Stop NIDAQ thread\n", " \n", " analysis_thread.join()\n", " nidaq_thread.join()\n", " \n", " print(\"Recording stopped, workers cleaned up\")\n", " \n", " return frames" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NIDAQ task created on Dev1/port1/line0\n", "Event detected! dF/F = 0.731\n", "Event detected! dF/F = 0.620\n", "Event detected! dF/F = 0.425\n", "Event detected! dF/F = 0.272\n", "Event detected! dF/F = 0.230\n", "Event detected! dF/F = 0.206\n", "Event detected! dF/F = 0.343\n", "Event detected! dF/F = 0.251\n", "Event detected! dF/F = 0.293\n", "Event detected! dF/F = 0.948\n", "Event detected! dF/F = 0.981\n", "Event detected! dF/F = 0.521\n", "Event detected! dF/F = 0.428\n", "Event detected! dF/F = 0.529\n", "Event detected! dF/F = 0.376\n", "Event detected! dF/F = 0.284\n", "Event detected! dF/F = 0.296\n", "Event detected! dF/F = 0.289\n", "Event detected! dF/F = 0.248\n", "Event detected! dF/F = 0.227\n", "Event detected! dF/F = 0.276\n", "Event detected! dF/F = 0.726\n", "Event detected! dF/F = 0.979\n", "Event detected! dF/F = 0.918\n", "Event detected! dF/F = 0.842\n", "Event detected! dF/F = 0.742\n", "Event detected! dF/F = 0.652\n", "Event detected! dF/F = 0.519\n", "Event detected! dF/F = 0.511\n", "Event detected! dF/F = 0.460\n", "Event detected! dF/F = 0.239\n", "Event detected! dF/F = 0.330\n", "Event detected! dF/F = 0.259\n", "Event detected! dF/F = 0.217\n", "Event detected! dF/F = 0.225\n", "Event detected! dF/F = 0.284\n", "Event detected! dF/F = 0.487\n", "Event detected! dF/F = 0.839\n", "Event detected! dF/F = 0.835\n", "Event detected! dF/F = 0.630\n", "Event detected! dF/F = 0.531\n", "Event detected! dF/F = 0.378\n", "Event detected! dF/F = 0.337\n", "Event detected! dF/F = 0.208\n", "Event detected! dF/F = 0.232\n", "Event detected! dF/F = 0.322\n", "Event detected! dF/F = 0.296\n", "Event detected! dF/F = 0.211\n", "Event detected! dF/F = 0.366\n", "Event detected! dF/F = 0.794\n", "Event detected! dF/F = 1.050\n", "Event detected! dF/F = 0.919\n", "Event detected! dF/F = 1.011\n", "Event detected! dF/F = 0.855\n", "Event detected! dF/F = 0.717\n", "Event detected! dF/F = 0.539\n", "Event detected! dF/F = 0.427\n", "Event detected! dF/F = 0.279\n", "Event detected! dF/F = 0.238\n", "Event detected! dF/F = 0.337\n", "Event detected! dF/F = 0.243\n", "Event detected! dF/F = 0.256\n", "Event detected! dF/F = 0.236\n", "Event detected! dF/F = 0.278\n", "Event detected! dF/F = 0.926\n", "Event detected! dF/F = 0.975\n", "Event detected! dF/F = 0.846\n", "Event detected! dF/F = 0.547\n", "Event detected! dF/F = 0.336\n", "Event detected! dF/F = 0.445\n", "Event detected! dF/F = 0.340\n", "Event detected! dF/F = 0.267\n", "Event detected! dF/F = 0.259\n", "Event detected! dF/F = 0.253\n", "Event detected! dF/F = 0.253\n", "Event detected! dF/F = 0.229\n", "Event detected! dF/F = 0.313\n", "Event detected! dF/F = 0.299\n", "Event detected! dF/F = 0.971\n", "Event detected! dF/F = 0.895\n", "Event detected! dF/F = 0.928\n", "Event detected! dF/F = 0.846\n", "Event detected! dF/F = 0.737\n", "Event detected! dF/F = 0.668\n", "Event detected! dF/F = 0.519\n", "Event detected! dF/F = 0.505\n", "Event detected! dF/F = 0.447\n", "Event detected! dF/F = 0.224\n", "Event detected! dF/F = 0.350\n", "Event detected! dF/F = 0.279\n", "Event detected! dF/F = 0.218\n", "Event detected! dF/F = 0.877\n", "Event detected! dF/F = 0.864\n", "Event detected! dF/F = 0.657\n", "Event detected! dF/F = 0.559\n", "Event detected! dF/F = 0.402\n", "Event detected! dF/F = 0.362\n", "Event detected! dF/F = 0.212\n", "Event detected! dF/F = 0.229\n", "Event detected! dF/F = 0.326\n", "Event detected! dF/F = 0.296\n", "Event detected! dF/F = 0.339\n", "Event detected! dF/F = 0.758\n", "Event detected! dF/F = 0.928\n", "Event detected! dF/F = 0.897\n", "Event detected! dF/F = 0.931\n", "Event detected! dF/F = 0.879\n", "Event detected! dF/F = 0.726\n", "Event detected! dF/F = 0.615\n", "Event detected! dF/F = 0.421\n", "Event detected! dF/F = 0.321\n", "Event detected! dF/F = 0.226\n", "Event detected! dF/F = 0.245\n", "Event detected! dF/F = 0.344\n", "Event detected! dF/F = 0.269\n", "Event detected! dF/F = 0.248\n", "Event detected! dF/F = 0.227\n", "Event detected! dF/F = 0.268\n", "Event detected! dF/F = 0.910\n", "Event detected! dF/F = 0.945\n", "Event detected! dF/F = 0.749\n", "Event detected! dF/F = 0.429\n", "Event detected! dF/F = 0.354\n", "Event detected! dF/F = 0.459\n", "Event detected! dF/F = 0.363\n", "Event detected! dF/F = 0.312\n", "Event detected! dF/F = 0.241\n", "Event detected! dF/F = 0.269\n", "Event detected! dF/F = 0.299\n", "Event detected! dF/F = 0.229\n", "Event detected! dF/F = 0.202\n", "Event detected! dF/F = 0.261\n", "Event detected! dF/F = 0.712\n", "Event detected! dF/F = 0.974\n", "Event detected! dF/F = 0.914\n", "Event detected! dF/F = 0.832\n", "Event detected! dF/F = 0.742\n", "Event detected! dF/F = 0.653\n", "Event detected! dF/F = 0.574\n", "Event detected! dF/F = 0.505\n", "Event detected! dF/F = 0.333\n", "Event detected! dF/F = 0.212\n", "Event detected! dF/F = 0.326\n", "Event detected! dF/F = 0.325\n", "Event detected! dF/F = 0.252\n", "Event detected! dF/F = 0.225\n", "Event detected! dF/F = 0.282\n", "Event detected! dF/F = 0.903\n", "Event detected! dF/F = 0.889\n", "Event detected! dF/F = 0.668\n", "Event detected! dF/F = 0.498\n", "Event detected! dF/F = 0.511\n", "Event detected! dF/F = 0.353\n", "Event detected! dF/F = 0.258\n", "Event detected! dF/F = 0.288\n", "Event detected! dF/F = 0.326\n", "Event detected! dF/F = 0.302\n", "Event detected! dF/F = 0.254\n", "Event detected! dF/F = 0.258\n", "Event detected! dF/F = 0.340\n", "Event detected! dF/F = 0.448\n", "Event detected! dF/F = 0.707\n", "Event detected! dF/F = 0.961\n", "Event detected! dF/F = 0.854\n", "Event detected! dF/F = 0.902\n", "Event detected! dF/F = 0.867\n", "Event detected! dF/F = 0.713\n", "Event detected! dF/F = 0.593\n", "Event detected! dF/F = 0.397\n", "Event detected! dF/F = 0.296\n", "Event detected! dF/F = 0.202\n", "Event detected! dF/F = 0.418\n", "Event detected! dF/F = 0.281\n", "Event detected! dF/F = 0.246\n", "Event detected! dF/F = 0.225\n", "Event detected! dF/F = 0.266\n", "Event detected! dF/F = 0.907\n", "Event detected! dF/F = 0.955\n", "Event detected! dF/F = 0.828\n", "Event detected! dF/F = 0.543\n", "Event detected! dF/F = 0.372\n", "Event detected! dF/F = 0.438\n", "Event detected! dF/F = 0.344\n", "Event detected! dF/F = 0.260\n", "Event detected! dF/F = 0.291\n", "Event detected! dF/F = 0.323\n", "Event detected! dF/F = 0.214\n", "Event detected! dF/F = 0.285\n", "Event detected! dF/F = 0.729\n", "Event detected! dF/F = 0.992\n", "Event detected! dF/F = 0.815\n", "Event detected! dF/F = 0.850\n", "Event detected! dF/F = 0.754\n", "Event detected! dF/F = 0.674\n", "Event detected! dF/F = 0.535\n", "Event detected! dF/F = 0.527\n", "Event detected! dF/F = 0.345\n", "Event detected! dF/F = 0.223\n", "Event detected! dF/F = 0.348\n", "Event detected! dF/F = 0.270\n", "Event detected! dF/F = 0.222\n", "Event detected! dF/F = 0.230\n", "Event detected! dF/F = 0.287\n", "Event detected! dF/F = 0.842\n", "Event detected! dF/F = 0.831\n", "Event detected! dF/F = 0.636\n", "Event detected! dF/F = 0.482\n", "Event detected! dF/F = 0.508\n", "Event detected! dF/F = 0.357\n", "Event detected! dF/F = 0.266\n", "Event detected! dF/F = 0.208\n", "Event detected! dF/F = 0.260\n", "Event detected! dF/F = 0.319\n", "Event detected! dF/F = 0.262\n", "Event detected! dF/F = 0.201\n", "Event detected! dF/F = 0.823\n", "Event detected! dF/F = 0.739\n", "Event detected! dF/F = 0.996\n", "Event detected! dF/F = 0.885\n", "Event detected! dF/F = 0.912\n", "Event detected! dF/F = 0.893\n", "Event detected! dF/F = 0.761\n", "Event detected! dF/F = 0.635\n", "Event detected! dF/F = 0.520\n", "Event detected! dF/F = 0.336\n", "Event detected! dF/F = 0.242\n", "Event detected! dF/F = 0.232\n", "Event detected! dF/F = 0.330\n", "Event detected! dF/F = 0.342\n", "Event detected! dF/F = 0.296\n", "Event detected! dF/F = 0.953\n", "Event detected! dF/F = 1.002\n", "Event detected! dF/F = 0.871\n", "Event detected! dF/F = 0.687\n", "Event detected! dF/F = 0.372\n", "Event detected! dF/F = 0.298\n", "Event detected! dF/F = 0.406\n", "Event detected! dF/F = 0.268\n", "Event detected! dF/F = 0.286\n", "Event detected! dF/F = 0.285\n", "Event detected! dF/F = 0.244\n", "Event detected! dF/F = 0.222\n", "Event detected! dF/F = 0.318\n", "Event detected! dF/F = 0.999\n", "Event detected! dF/F = 1.013\n", "Event detected! dF/F = 0.953\n", "Event detected! dF/F = 0.856\n", "Event detected! dF/F = 0.760\n", "Event detected! dF/F = 0.680\n", "Event detected! dF/F = 0.537\n", "Event detected! dF/F = 0.520\n", "Event detected! dF/F = 0.464\n", "Event detected! dF/F = 0.238\n", "Event detected! dF/F = 0.346\n", "Event detected! dF/F = 0.276\n", "Event detected! dF/F = 0.228\n", "Event detected! dF/F = 0.209\n", "Event detected! dF/F = 0.872\n", "Event detected! dF/F = 0.860\n", "Event detected! dF/F = 0.656\n", "Event detected! dF/F = 0.561\n", "Event detected! dF/F = 0.403\n", "Event detected! dF/F = 0.309\n", "Event detected! dF/F = 0.204\n", "Event detected! dF/F = 0.229\n", "Event detected! dF/F = 0.334\n", "Event detected! dF/F = 0.276\n", "Event detected! dF/F = 0.208\n", "Event detected! dF/F = 0.204\n", "Event detected! dF/F = 0.359\n", "Event detected! dF/F = 0.784\n", "Event detected! dF/F = 0.953\n", "Event detected! dF/F = 0.918\n", "Event detected! dF/F = 0.812\n", "Event detected! dF/F = 0.917\n", "Event detected! dF/F = 0.767\n", "Event detected! dF/F = 0.651\n", "Event detected! dF/F = 0.481\n", "Event detected! dF/F = 0.317\n", "Event detected! dF/F = 0.221\n", "Event detected! dF/F = 0.375\n", "Event detected! dF/F = 0.236\n", "Event detected! dF/F = 0.239\n", "Event detected! dF/F = 0.281\n", "Event detected! dF/F = 0.931\n", "Event detected! dF/F = 0.962\n", "Event detected! dF/F = 0.767\n", "Event detected! dF/F = 0.434\n", "Event detected! dF/F = 0.355\n", "Event detected! dF/F = 0.466\n", "Event detected! dF/F = 0.356\n", "Event detected! dF/F = 0.282\n", "Event detected! dF/F = 0.284\n", "Event detected! dF/F = 0.273\n", "Event detected! dF/F = 0.310\n", "Event detected! dF/F = 0.208\n", "Event detected! dF/F = 0.297\n", "Event detected! dF/F = 0.745\n", "Event detected! dF/F = 1.000\n", "Event detected! dF/F = 0.823\n", "Event detected! dF/F = 0.875\n", "Event detected! dF/F = 0.767\n", "Event detected! dF/F = 0.687\n", "Event detected! dF/F = 0.543\n", "Event detected! dF/F = 0.533\n", "Event detected! dF/F = 0.351\n", "Event detected! dF/F = 0.257\n", "Event detected! dF/F = 0.352\n", "Event detected! dF/F = 0.280\n", "Event detected! dF/F = 0.218\n", "Event detected! dF/F = 0.226\n", "Event detected! dF/F = 0.207\n", "Event detected! dF/F = 0.909\n", "Event detected! dF/F = 0.895\n", "Event detected! dF/F = 0.680\n", "Event detected! dF/F = 0.507\n", "Event detected! dF/F = 0.482\n", "Event detected! dF/F = 0.312\n", "Event detected! dF/F = 0.205\n", "Event detected! dF/F = 0.228\n", "Event detected! dF/F = 0.323\n", "Event detected! dF/F = 0.300\n", "Event detected! dF/F = 0.342\n", "Event detected! dF/F = 0.763\n", "Event detected! dF/F = 0.934\n", "Event detected! dF/F = 0.900\n", "Event detected! dF/F = 0.933\n", "Event detected! dF/F = 0.881\n", "Event detected! dF/F = 0.770\n", "Event detected! dF/F = 0.654\n", "Event detected! dF/F = 0.477\n", "Event detected! dF/F = 0.362\n", "Event detected! dF/F = 0.266\n", "Event detected! dF/F = 0.250\n", "Event detected! dF/F = 0.345\n", "Event detected! dF/F = 0.258\n", "Event detected! dF/F = 0.320\n", "Event detected! dF/F = 0.275\n", "Event detected! dF/F = 0.921\n", "Event detected! dF/F = 0.970\n", "Event detected! dF/F = 0.843\n", "Event detected! dF/F = 0.546\n", "Event detected! dF/F = 0.362\n", "Event detected! dF/F = 0.431\n", "Event detected! dF/F = 0.384\n", "Event detected! dF/F = 0.284\n", "Event detected! dF/F = 0.216\n", "Event detected! dF/F = 0.272\n", "Event detected! dF/F = 0.281\n", "Event detected! dF/F = 0.334\n", "Event detected! dF/F = 0.241\n", "Event detected! dF/F = 0.225\n", "Event detected! dF/F = 0.266\n", "Event detected! dF/F = 0.930\n", "Event detected! dF/F = 0.942\n", "Event detected! dF/F = 0.884\n", "Event detected! dF/F = 0.801\n", "Event detected! dF/F = 0.710\n", "Event detected! dF/F = 0.635\n", "Event detected! dF/F = 0.504\n", "Event detected! dF/F = 0.499\n", "Event detected! dF/F = 0.274\n", "Event detected! dF/F = 0.208\n", "Event detected! dF/F = 0.339\n", "Event detected! dF/F = 0.332\n", "Event detected! dF/F = 0.255\n", "Event detected! dF/F = 0.203\n", "Event detected! dF/F = 0.256\n", "Event detected! dF/F = 0.924\n", "Event detected! dF/F = 0.756\n", "Event detected! dF/F = 0.688\n", "Event detected! dF/F = 0.578\n", "Event detected! dF/F = 0.411\n", "Event detected! dF/F = 0.310\n", "Event detected! dF/F = 0.268\n", "Event detected! dF/F = 0.334\n", "Event detected! dF/F = 0.311\n", "Event detected! dF/F = 0.207\n", "Event detected! dF/F = 0.205\n", "Event detected! dF/F = 0.360\n", "Event detected! dF/F = 0.786\n", "Event detected! dF/F = 1.042\n", "Event detected! dF/F = 0.912\n", "Event detected! dF/F = 0.945\n", "Event detected! dF/F = 0.909\n", "Event detected! dF/F = 0.778\n", "Event detected! dF/F = 0.661\n", "Event detected! dF/F = 0.483\n", "Event detected! dF/F = 0.365\n", "Event detected! dF/F = 0.218\n", "Event detected! dF/F = 0.241\n", "Event detected! dF/F = 0.317\n", "Event detected! dF/F = 0.244\n", "Event detected! dF/F = 0.248\n", "Event detected! dF/F = 0.309\n", "Event detected! dF/F = 0.946\n", "Event detected! dF/F = 0.995\n", "Event detected! dF/F = 0.865\n", "Event detected! dF/F = 0.563\n", "Event detected! dF/F = 0.379\n", "Event detected! dF/F = 0.446\n", "Event detected! dF/F = 0.353\n", "Event detected! dF/F = 0.270\n", "Event detected! dF/F = 0.297\n", "Event detected! dF/F = 0.289\n", "Event detected! dF/F = 0.320\n", "Analysis worker received stop signalNIDAQ worker received stop signal\n", "\n", "Recording stopped, workers cleaned up\n" ] } ], "source": [ "# Get FOV\n", "filename, save_directory, data_filepath = get_save_info()\n", "fov = get_fov(save_dir=save_directory, filename=filename)\n", "\n", "# Start recording with analysis\n", "frames = live_screen_record_with_analysis(\n", " fov,\n", " window_size=20, # Adjust based on your needs\n", " event_threshold=0.2, # Adjust based on your needs\n", " card_id='Dev1',\n", " port_line='port1/line0',\n", " display_live=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### live screen record and threading of keyboard interrupt listener" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "#SCRIPT\n", "filename, save_directory, data_filepath = get_save_path()\n", "fov = get_fov(save_dir=save_directory,filename=filename)\n", "frames = live_screen_record(fov, save_frames=True)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "cv2.destroyAllWindows()" ] } ], "metadata": { "kernelspec": { "display_name": "snapshot", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.5" } }, "nbformat": 4, "nbformat_minor": 2 }